static u64 __initdata srat_region_mask;
-static u64 __init fill_mask(u64 mask)
-{
- while (mask & (mask + 1))
- mask |= mask + 1;
- return mask;
-}
-
static int __init srat_parse_region(struct acpi_subtable_header *header,
const unsigned long end)
{
ma->base_address, ma->base_address + ma->length - 1);
srat_region_mask |= ma->base_address |
- fill_mask(ma->base_address ^
- (ma->base_address + ma->length - 1));
+ pdx_region_mask(ma->base_address, ma->length);
return 0;
}
acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat))
return;
- srat_region_mask = fill_mask(addr - 1);
+ srat_region_mask = pdx_init_mask(addr);
acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
srat_parse_region, 0);
if (e820.map[i].type != E820_RAM)
continue;
- if (~mask &
- fill_mask(e820.map[i].addr ^
- (e820.map[i].addr + e820.map[i].size - 1)))
+ if (~mask & pdx_region_mask(e820.map[i].addr, e820.map[i].size))
mask = 0;
}
pdx_group_valid));
}
+/* Sets all bits from the most-significant 1-bit down to the LSB */
+static u64 __init fill_mask(u64 mask)
+{
+ while (mask & (mask + 1))
+ mask |= mask + 1;
+ return mask;
+}
+
+u64 __init pdx_init_mask(u64 base_addr)
+{
+ return fill_mask(base_addr - 1);
+}
+
+u64 __init pdx_region_mask(u64 base, u64 len)
+{
+ return fill_mask(base ^ (base + len - 1));
+}
+
void set_pdx_range(unsigned long smfn, unsigned long emfn)
{
unsigned long idx, eidx;
(sizeof(*frame_table) & -sizeof(*frame_table)))
extern unsigned long pdx_group_valid[];
+extern u64 pdx_init_mask(u64 base_addr);
+extern u64 pdx_region_mask(u64 base, u64 len);
+
extern void set_pdx_range(unsigned long smfn, unsigned long emfn);
#define page_to_pdx(pg) ((pg) - frame_table)